﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Oracle.DataAccess.Client;
using Oracle.DataAccess.Types;
using Npgsql;

namespace WindowsFormsApplication1
{
    public partial class Instancia : Form
    {

        public Boolean no_events = true;

        public Instancia()
        {
            InitializeComponent();
        }

        private void enable_controls()
        {

            lbl_actualizando.Visible = false;
            this.Refresh();
        }

        private void disable_controls()
        {
            lbl_actualizando.Visible = true;
            this.Refresh();
        }

        private void Instancia_Load(object sender, EventArgs e)
        {
            try
            {
                if (frm_login.oracle)
                {
                    info_instancia_o(frm_login.con);
                }
                if (frm_login.postgre)
                {
                    info_instancia_p(frm_login.conn);
                }

                if (dgv_sessions.RowCount > 0)
                {
                    if (frm_login.oracle)
                    {
                        cargar_cursores_o(dgv_sessions.Rows[0].Cells[0].Value.ToString());
                    }
                    if (frm_login.postgre)
                    {
                        cargar_cursores_p(dgv_sessions.Rows[0].Cells[0].Value.ToString());
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Ocurrio un evento inesperado en lo interno del programa.\nPara prevenir futuras fallas se recomienda que reinicie Multi-Bd-Explorer.\n\nA continuación se detalla el error:\n\n" + ex.Message, "Exepcion del sistema", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        public void info_instancia_o(OracleConnection con)
        {
            try
            {
                dgv_sessions.Rows.Clear();
                dgv_sessions.Columns.Clear();

                dgv_cursors.Rows.Clear();
                dgv_cursors.Columns.Clear();

                disable_controls();
                no_events = true;

                dgv_sessions.Columns.Add("SID", "SID");
                dgv_sessions.Columns.Add("Proceso", "Proceso");
                dgv_sessions.Columns.Add("Maquina", "Maquina");
                dgv_sessions.Columns.Add("Programa", "Programa");
                dgv_sessions.Columns.Add("Serial", "Serial");

                dgv_cursors.Columns.Add("SentenciaSQL", "SentenciaSQL");

                
                
                //OracleCommand cmd = new OracleCommand("select name, created from v$database", con);
                OracleCommand cmd = new OracleCommand("select instance_name, status, startup_time, version from v$instance", con);
                OracleDataReader dr = cmd.ExecuteReader();
                if (dr.Read())
                {
                    llenar_labels(dr[0].ToString(), dr[1].ToString(), dr[2].ToString(), dr[3].ToString());
                }
                cmd.CommandText = "select sid, process, machine, program, serial# from v$session";
                dr = cmd.ExecuteReader();
                while (dr.Read())
                {
                    agregar_session(dr[0].ToString(), dr[1].ToString(), dr[2].ToString(), dr[3].ToString(), dr[4].ToString());
                }
                no_events = false;
            }
            catch (OracleException oe)
            {
                MessageBox.Show("Por favor espere unos segundos e intente denuevo.\nSi nada de esto funciona revise su conexión con el servidor Oracle y su configuración\nA continuación se detalla la exepción: \n\n" + oe.Message, "Oracle exeption", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            catch (NpgsqlException pe)
            {
                MessageBox.Show("Por favor espere unos segundos e intente denuevo.\nSi nada de esto funciona revise su conexión con el servidor Postgresql y su configuración\nA continuación se detalla la exepción: \n\n" + pe.Message, "Postgresql exeption", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Ocurrio un evento inesperado en lo interno del programa.\nPara prevenir futuras fallas se recomienda que reinicie Multi-Bd-Explorer.\n\nA continuación se detalla el error:\n\n" + ex.Message, "Exepcion del sistema", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            finally
            {
                enable_controls();
            }
        }

        public void info_instancia_p(NpgsqlConnection conn)
        {
            try
            {
                dgv_sessions.Rows.Clear();
                dgv_sessions.Columns.Clear();

                dgv_cursors.Rows.Clear();
                dgv_cursors.Columns.Clear();

                disable_controls();
                no_events = true;


                /*
                dgv_sessions.Columns.Add("SID", "SID");
                dgv_sessions.Columns.Add("Proceso", "Proceso");
                dgv_sessions.Columns.Add("Maquina", "Maquina");
                dgv_sessions.Columns.Add("Programa", "Programa");
                dgv_sessions.Columns.Add("Serial", "Serial");

                dgv_cursors.Columns.Add("SentenciaSQL", "SentenciaSQL");

                

                //OracleCommand cmd = new OracleCommand("select name, created from v$database", con);
                OracleCommand cmd = new OracleCommand("select instance_name, status, startup_time, version from v$instance", con);
                OracleDataReader dr = cmd.ExecuteReader();
                if (dr.Read())
                {
                    llenar_labels(dr[0].ToString(), dr[1].ToString(), dr[2].ToString(), dr[3].ToString());
                }
                cmd.CommandText = "select sid, process, machine, program, serial# from v$session";
                dr = cmd.ExecuteReader();
                while (dr.Read())
                {
                    agregar_session(dr[0].ToString(), dr[1].ToString(), dr[2].ToString(), dr[3].ToString(), dr[4].ToString());
                }

                */


                no_events = false;
            }
            catch (OracleException oe)
            {
                MessageBox.Show("Por favor espere unos segundos e intente denuevo.\nSi nada de esto funciona revise su conexión con el servidor Oracle y su configuración\nA continuación se detalla la exepción: \n\n" + oe.Message, "Oracle exeption", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            catch (NpgsqlException pe)
            {
                MessageBox.Show("Por favor espere unos segundos e intente denuevo.\nSi nada de esto funciona revise su conexión con el servidor Postgresql y su configuración\nA continuación se detalla la exepción: \n\n" + pe.Message, "Postgresql exeption", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Ocurrio un evento inesperado en lo interno del programa.\nPara prevenir futuras fallas se recomienda que reinicie Multi-Bd-Explorer.\n\nA continuación se detalla el error:\n\n" + ex.Message, "Exepcion del sistema", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            finally
            {
                enable_controls();
            }
        }

        public void llenar_labels(String nom, String st, String fech, String ver)
        {
            lbl_nom.Text = nom;
            lbl_estado.Text = st;
            lbl_fecha.Text = fech;
            lbl_version.Text = ver;
        }

        public void agregar_session(String sid, String nom, String maq, String prog, String ser)
        {
            try
            {

                dgv_sessions.Rows.Add();
                int ultima_fila = dgv_sessions.RowCount - 1;
                dgv_sessions.Rows[ultima_fila].Cells[0].Value = sid;
                dgv_sessions.Rows[ultima_fila].Cells[1].Value = nom;
                dgv_sessions.Rows[ultima_fila].Cells[2].Value = maq;
                dgv_sessions.Rows[ultima_fila].Cells[3].Value = prog;
                dgv_sessions.Rows[ultima_fila].Cells[4].Value = ser;
            }
            catch (Exception ex)
            {
                MessageBox.Show("Ocurrio un evento inesperado en lo interno del programa.\nPara prevenir futuras fallas se recomienda que reinicie Multi-Bd-Explorer.\n\nA continuación se detalla el error:\n\n" + ex.Message, "Exepcion del sistema", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        public void agregar_cursor(String sql_t)
        {
            try
            {
                dgv_cursors.Rows.Add();
                int ultima_fila = dgv_cursors.RowCount - 1;
                dgv_cursors.Rows[ultima_fila].Cells[0].Value = sql_t;
            }
            catch (Exception ex)
            {
                MessageBox.Show("Ocurrio un evento inesperado en lo interno del programa.\nPara prevenir futuras fallas se recomienda que reinicie Multi-Bd-Explorer.\n\nA continuación se detalla el error:\n\n" + ex.Message, "Exepcion del sistema", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        public void cargar_cursores_o(String sid)
        {
            try
            {
                dgv_cursors.Rows.Clear();
                disable_controls();
                OracleCommand cmd = new OracleCommand("select sql_text from v$open_cursor where sid = " + sid, frm_login.con);
                OracleDataReader dr = cmd.ExecuteReader();
                while (dr.Read())
                {
                    agregar_cursor(dr[0].ToString());
                }
            }
            catch (OracleException oe)
            {
                MessageBox.Show("Por favor espere unos segundos e intente denuevo.\nSi nada de esto funciona revise su conexión con el servidor Oracle y su configuración\nA continuación se detalla la exepción: \n\n" + oe.Message, "Oracle exeption", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            catch (NpgsqlException pe)
            {
                MessageBox.Show("Por favor espere unos segundos e intente denuevo.\nSi nada de esto funciona revise su conexión con el servidor Postgresql y su configuración\nA continuación se detalla la exepción: \n\n" + pe.Message, "Postgresql exeption", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Ocurrio un evento inesperado en lo interno del programa.\nPara prevenir futuras fallas se recomienda que reinicie Multi-Bd-Explorer.\n\nA continuación se detalla el error:\n\n" + ex.Message, "Exepcion del sistema", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            finally
            {
                enable_controls();
            }
        
        }
        public void cargar_cursores_p(String sid)
        {
            try
            {
               
                dgv_cursors.Rows.Clear();
                disable_controls();

                /*
                OracleCommand cmd = new OracleCommand("select sql_text from v$open_cursor where sid = " + sid, frm_login.con);
                OracleDataReader dr = cmd.ExecuteReader();
                while (dr.Read())
                {
                    agregar_cursor(dr[0].ToString());
                }

                */
            }
            catch (OracleException oe)
            {
                MessageBox.Show("Por favor espere unos segundos e intente denuevo.\nSi nada de esto funciona revise su conexión con el servidor Oracle y su configuración\nA continuación se detalla la exepción: \n\n" + oe.Message, "Oracle exeption", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            catch (NpgsqlException pe)
            {
                MessageBox.Show("Por favor espere unos segundos e intente denuevo.\nSi nada de esto funciona revise su conexión con el servidor Postgresql y su configuración\nA continuación se detalla la exepción: \n\n" + pe.Message, "Postgresql exeption", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Ocurrio un evento inesperado en lo interno del programa.\nPara prevenir futuras fallas se recomienda que reinicie Multi-Bd-Explorer.\n\nA continuación se detalla el error:\n\n" + ex.Message, "Exepcion del sistema", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            finally
            {
                enable_controls();
            }
        }





        public Boolean finalizar_session_o(String sid, String serial)
        {
            Boolean ok = false;
            
            try
            {
                disable_controls();
                OracleCommand cmd = new OracleCommand("alter system kill session '" + sid + "," + serial + "'", frm_login.con);
                cmd.ExecuteNonQuery();
                ok = true;
                
            }
            catch (OracleException oe)
            {
                MessageBox.Show("Por favor espere unos segundos e intente denuevo.\nSi nada de esto funciona revise su conexión con el servidor Oracle y su configuración\nA continuación se detalla la exepción: \n\n" + oe.Message, "Oracle exeption", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            catch (NpgsqlException pe)
            {
                MessageBox.Show("Por favor espere unos segundos e intente denuevo.\nSi nada de esto funciona revise su conexión con el servidor Postgresql y su configuración\nA continuación se detalla la exepción: \n\n" + pe.Message, "Postgresql exeption", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Ocurrio un evento inesperado en lo interno del programa.\nPara prevenir futuras fallas se recomienda que reinicie Multi-Bd-Explorer.\n\nA continuación se detalla el error:\n\n" + ex.Message, "Exepcion del sistema", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            finally
            {
                enable_controls();
            }
            return ok;
            
        }

        public Boolean finalizar_session_p()
        {

            Boolean ok = false;

            try
            {
                disable_controls();
                /*
                OracleCommand cmd = new OracleCommand("alter system kill session '" + sid + "," + serial + "'", frm_login.con);
                cmd.ExecuteNonQuery();

                */
                ok = true;

            }
            catch (OracleException oe)
            {
                MessageBox.Show("Por favor espere unos segundos e intente denuevo.\nSi nada de esto funciona revise su conexión con el servidor Oracle y su configuración\nA continuación se detalla la exepción: \n\n" + oe.Message, "Oracle exeption", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            catch (NpgsqlException pe)
            {
                MessageBox.Show("Por favor espere unos segundos e intente denuevo.\nSi nada de esto funciona revise su conexión con el servidor Postgresql y su configuración\nA continuación se detalla la exepción: \n\n" + pe.Message, "Postgresql exeption", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Ocurrio un evento inesperado en lo interno del programa.\nPara prevenir futuras fallas se recomienda que reinicie Multi-Bd-Explorer.\n\nA continuación se detalla el error:\n\n" + ex.Message, "Exepcion del sistema", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            finally
            {
                enable_controls();
            }
            return ok;
        
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (frm_login.oracle)
            {
                int fila = dgv_sessions.SelectedRows[0].Index;
                String sid = dgv_sessions.Rows[fila].Cells[0].Value.ToString();
                String ser = dgv_sessions.Rows[fila].Cells[4].Value.ToString();
                if (finalizar_session_o(sid, ser))
                {
                    MessageBox.Show("Sesión finalizada correctamente ","Finalizar sesión", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }

                actualizar_datos();
            }
            if (frm_login.postgre)
            { 
            
            }


            


        }

        public void actualizar_datos()
        {
            
               
                if (frm_login.oracle)
                {
                    info_instancia_o(frm_login.con);
                }
                if (frm_login.postgre)
                {
                    info_instancia_p(frm_login.conn);
                }

                if (dgv_sessions.RowCount > 0)
                {
                    if (frm_login.oracle)
                    {
                        cargar_cursores_o(dgv_sessions.Rows[0].Cells[0].Value.ToString());
                    }
                    if (frm_login.postgre)
                    {
                        cargar_cursores_p(dgv_sessions.Rows[0].Cells[0].Value.ToString());
                    }
                }

            }

           
        
        

   

        private void dgv_sessions_RowEnter(object sender, DataGridViewCellEventArgs e)
        {
            if ((e.RowIndex >= 0) && (no_events == false))
            {
                if (frm_login.oracle)
                {
                    cargar_cursores_o(dgv_sessions.Rows[e.RowIndex].Cells[0].Value.ToString());
                }
                if (frm_login.postgre)
                {
                    cargar_cursores_p(dgv_sessions.Rows[e.RowIndex].Cells[0].Value.ToString());
                }
            }

        }

     

        private void llb_actualizar_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            actualizar_datos();
        }

        private void btn_cerrar_Click(object sender, EventArgs e)
        {
            this.Close();
        }

  

    }
}
